USRP N310,Gnuradio初探 | 您所在的位置:网站首页 › usrp n310 怎么单独收数据 › USRP N310,Gnuradio初探 |
文章目录
实验平台USRP-OFDM发送端框架发送端模块简介OFDM符号结构发送端外部TCP客户端程序USRP-OFDM接收端框架接收端模块简介接收端外部TCP服务端程序TCP客户端服务器注意事项
输入数据编码选择IP数据帧传输效率参考资料
近期实验需要搭建一个软件无线电环境平台,在琢磨一段时间后,以下是对之前的实验总结一下。 实验平台 硬件:笔记本2台,USRP N310两台,及辅助天线等软件:在Ubuntu系统下安装Gnuradio3.7 实验前提,USRP能与电脑建立收发通信 USRP-OFDM发送端框架
Socket PDU:与外部程序建立socket连接,对整个流图进行数据输入。 PDU to Tagged Stream:将协议数据转化为固定长度byte类型数据,并给数据加上长度标记。 Stream CRC32:给数据尾部加上32位(4字节)循环冗余校验-----信道编码。 Protocol Formatter:利用数据头生成对象创建一个6字节的数据头,包含数据帧长度,当前数据帧号等。 Repack Bits:对数据进行重新打包,8bits一组转换为2bits一组或者1bit一组的数据,为后续进行BPSK、 QPSK映射,此过程不存在数据bit丢失。 Chunks to Symbols:根据Symbol Table将byte数据进行浮点数或者复数映射,byte型数据转换为复数型数 据。 Tagged Stream Mux:将头部BPSK符号与载荷QPSK符号组装在一起进行OFDM调制。 OFDM Carrier Allocator:OFDM子载波分配,分配数据子载波,导频子载波,同步子载波,直流子载波。 FFT:对分配后的子载波进行傅里叶变换,完成OFDM调制。 OFDM Cyclic Prefixer:给OFDM加入循环前缀,防止ofdm符号间干扰(ISI)。 Multiply Const:乘常数模块,乘以小于1的值,限制幅度,防止发送非线性失真。 Tag Gate:阻止标记符号向后延续。 其他参数: protocol parser: 协议分析器 FEC: 前向纠错编码,送入传输信道之前 MSB: 最高位有效 Becimation: 抽取,转变频率 OFDM符号结构ofdm输出标签:载波偏移,信道均衡系数,数据帧,接收时间 ofdm子载波: 左6个子载波[-32,-27],右5个子载波[26,31]为虚拟子载波 不使用载波为0,———减少带外功率,抑制ACI(相邻信道干扰) 一个OFDM符号:包含 虚拟子载波 ,直流子载波 ,射频子载波 ,有效数据子载波[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CfNVPpsv-1601025338052)(D:\实验作图记录\OFDM符号结构.jpg)] 以进行64FFT变换为例,总载波个数为64,除去虚拟子载波,直流子载波,射频子载波,剩余有效数据子载波48个,数据头部Head采用BPSK调制,(6 * 8)/1一个符号用一位比特表示,数据载荷加上校验码Payload部分采用QBSK调制,((96+4 )* 8)/2,一个符号用两个比特位表示。数据生成头部加载荷总共需要OFDM符号个数: ( 6 ∗ 8 ) / 1 + ( 96 + 4 ) ∗ 8 / 2 = 448 (6*8)/1 + (96 + 4 )*8 / 2 = 448 (6∗8)/1+(96+4)∗8/2=448 448 / 48 ≈ 10 个 O F D M 符 号 448 / 48 ≈ 10 个OFDM符号 448/48≈10个OFDM符号 加上2个OFDM符号同步字,发送一次数据共需要 12 个OFDM符号周期。 发送端外部TCP客户端程序 import socket import time """ tcp 客户端,输入发送内容,从文件读出数据,按照每次96字节方式发送 """ def main1(): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('192.168.10.3', 9090)) while True: tmp = input('请输入您要发送的内容:') if tmp != 'exit': s.send('{}\n'.format(tmp).encode('utf-8')) print('{}\n'.format(tmp).encode()) else: break def main(): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('192.168.10.3', 9090)) with open('./SendData', 'r', encoding='utf-8') as R_file: while True: content = R_file.read(96) if content != '': s.send('{}'.format(content).encode('utf-8')) print(content, end='') time.sleep(0.01) else: print('数据发送结束!!!') s.close() break if __name__ == '__main__': main() # main1() USRP-OFDM接收端框架
UHD USRP Source:与硬件USRP N310 连接,接收空间中电磁数据,实现数字下变频,ADC变换,转换为基 带信号输入给Gunradio软件款图。 Schmidl & Cox OFDM Synch:实现符号定时同步,除去小数部分载波频偏。 Delay:延时模块,延迟一个ofdm符号周期,fft_len + 循环前缀(64+16)。 Frequency Mod:频率调制模块,产生一个和载波频偏对应的序列,与接收数据流相乘,达到去载波频偏。 Multiply:两数据相乘,去除小数载波频偏,消除ACI干扰。 Head/Payload Demux:根据定时信息与帧头信息,将数据头与载荷部分分开,输入信号分别为去除载波频偏 的数据流,触发信息,解码后的帧头信息。输出为帧头部数据,载荷数据。 FFT:进行逆傅里叶变换。 OFDM Channel Estimation:信道评估模块,得到整数倍频偏和系统频域响应。 OFDM Frame Equalizer:OFDM帧均衡模块,纠正整数倍频偏,对接收信号进行均衡。 OFDM Serializer:逆OFDM子载波分配,与发送端OFDM Carrier Allocator 相逆的过程,找到携带数据的48 个子载波,并提取出其信息。 Constellation Decoder:解符号映射,分别进行逆BPSK,QPSK映射,转化为byte类型数据。 Repack Bits:与发送端相逆的过程,字节重新组合,不丢失比特信息。 Stream CRC32:循环冗余校验,校验数据是否出错并输出。 Tagged Stream to PDU:byte类型数据转换为协议数据。 Socket PDU:与外部程序建立socket连接。 接收端外部TCP服务端程序 import socket """ tcp 服务端,接收客户端发送的数据 """ def main(): host = '192.168.10.1' port = 9090 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind((host, port)) server_socket.listen(1) client_socket, client_add = server_socket.accept() while True: data = client_socket.recv(1024) data = data.decode('utf-8') print(data) # client_socket.close() if __name__ == '__main__': main() TCP客户端服务器注意事项 TCP服务器端需要先绑定IP与端口,等待客户端连接,客户端则不需要TCP客户端需先与服务器端建立连接才能通信TCP 三次握手 输入数据编码选择ASCII:128个字符,单字节编码,目前只使用低7位二进制表示,保留最高位,A-65,a-97,0-48 UTF-8:可变长字节编码,1-4字节: US-ASCII:1字节拉丁文,希腊字母,阿拉伯文:2字节中日韩,东南亚文字:3字节少数语言字符:4字节GBK:汉字编码字符集 IP数据帧传输效率 IP数据帧:MTU,包含头部信息14个字节,尾部校验和FCS 4个字节,以太网数据帧的传输效率: α = ( T − 14 − 4 ) / T α=(T-14-4)/T α=(T−14−4)/T 参考资料1.USRP—OFDM通信实验报告. 2.GNU Radio教程. 3.Linux系统下搭建USRP + GNU Radio开发环境. 4.OFDM调制理解. 5.PDU(协议数据单元). 6.Python学习笔记——网络-TCP. |
CopyRight 2018-2019 实验室设备网 版权所有 |